/**
 * Copyright (C), 2022-2025, www.bosssof.com.cn
 * @FileName RoleService.java
 * @Author hantianbing
 * @Date 2022-12-9
 * @Description 文件定义了角色的管理接口，包括角色增 删 改查 以及角色分配资源
 * History:
 * <author> hantianbing
 * <time> 2022-12-9
 * <version> 1.0.0
 * <desc> 文件定义了角色的管理接口，包括角色增 删 改查 以及角色分配资源
 */
package com.sd365.permission.centre.service;

import com.sd365.permission.centre.entity.Node;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.pojo.dto.*;
import com.sd365.permission.centre.pojo.query.RoleQuery;
import com.sd365.permission.centre.pojo.query.UserQuery;
import com.sd365.permission.centre.pojo.vo.RoleCompanyVO;
import com.sd365.permission.centre.pojo.vo.RoleVO;
import com.sd365.permission.centre.pojo.vo.UserVO;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.List;

/**
 * @Class RoleService
 * @Description roleService的接口
 * @Author hantianbing
 * @Date 2022-12-9
 * @version 1.0.0
 */

@CacheConfig(cacheNames = "RoleService")
public interface RoleService {
    /**
     * 设置版本和状态的值
     */
    byte INITIALIZE_STATUS_VALUE=1;
    long INITIALIZE_VERSION_VALUE=1;


    /***
     * @Description 在系统启动时候将初始化角色和资源的关系，主要为网关鉴权服务
     * @param role  角色信息
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:48
     * @Author hantianbing
     **/
    Boolean initRoleResourceRedis(Role role);

    /***
     * @Description 多角色分配多资源
     * @param roleResourceDTO   角色和资源
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:48
     * @Author hantianbing
     **/
    @Transactional
    Boolean assignResource(RoleResourceDTO roleResourceDTO);


    /***
     * @Description 分配用户的角色
     * @param userRoleDTO   角色和用户进行分配
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:49
     * @Author hantianbing
     **/
    @Transactional
    Boolean assignUser(UserRoleDTO userRoleDTO);


    /***
     * @Description 通过角色id查询全部资源
     * @param roleId 角色id
     * @return java.util.List<com.sd365.permission.centre.entity.Node>
     * @Date 2022/12/29 14:49
     * @Author hantianbing
     **/
    List<Node> queryResourceByRoleId(long roleId);


    /***
     * @Description 查询全部公司
     * @return java.util.List<com.sd365.permission.centre.entity.Node>
     * @Date 2022/12/29 14:51
     * @Author hantianbing
     **/
    List<Node> selectCompany();

    /***
     * @Description 查询有没有该角色
     * @param roleDTO 要验证的角色
     * @return boolean
     * @Date 2022/12/29 14:52
     * @Author hantianbing
     **/
    boolean haveRole(@RequestBody @Valid RoleDTO roleDTO);

    /***
     * @Description 添加角色， 复制角色也走这个接口
     * @param roleDTO  添加的角色的信息
     * @return java.lang.Boolean
     * @Date 2022/12/26 10:09
     * @Author hantianbing
     **/
    Boolean add(@RequestBody @Valid RoleDTO roleDTO);


    /***
     * @Description 删除角色， 通过角色id， version
     * @param id    角色id
     * @param version  角色version
     * @return java.lang.Boolean
     * @Date 2022/12/26 10:09
     * @Author hantianbing
     **/
    Boolean remove(Long id, Long version);



    /***
     * @Description 更新角色的信息， 通过传入的角色信息
     * @param roleDTO 传入的角色信息
     * @return com.sd365.permission.centre.pojo.dto.RoleDTO
     * @Date 2022/12/29 14:53
     * @Author hantianbing
     **/
    RoleDTO modify(RoleDTO roleDTO);


    /***
     * @Description 通用查询，能够根据角色的code， id 模糊查询角色
     * @param roleQuery 角色的信息
     * @return java.util.List<com.sd365.permission.centre.pojo.vo.RoleVO>
     * @Date 2022/12/29 14:54
     * @Author hantianbing
     **/
    List<RoleVO> commonQuery(RoleQuery roleQuery);


    /***
     * @Description 通过角色id， 查询角色
     * @param id 角色id
     * @return com.sd365.permission.centre.pojo.vo.RoleVO
     * @Date 2022/12/29 14:54
     * @Author hantianbing
     **/
    RoleVO queryById(Long id);

    /***
     * @Description todo 复制一条和RoleDTO 一样的记录并且将值返回前端
     * @param id  复制的角色的id
     * @return com.sd365.permission.centre.pojo.dto.RoleDTO
     * @Date 2022/12/26 10:10
     * @Author hantianbing
     **/
    RoleDTO copy(Long id);

    /***
     * @Description 批量删除角色
     * @param roleDTOS 要批量删除的角色
     * @return java.lang.Boolean
     * @Date 2022/12/26 10:17
     * @Author hantianbing
     **/
    @Transactional
    Boolean batchRemove(RoleDTO[] roleDTOS);


    /***
     * @Description 通用查询用户
     * @param userQuery 要查询的用户信息
     * @return java.util.List<com.sd365.permission.centre.pojo.vo.UserVO>
     * @Date 2022/12/29 14:56
     * @Author hantianbing
     **/
    List<UserVO> commonQueryUser(UserQuery userQuery);


    /***
     * @Description  查询角色的资源
     * @param id    角色id
     * @return com.sd365.permission.centre.pojo.dto.RoleDTO
     * @Date 2022/12/29 14:56
     * @Author hantianbing
     **/
    RoleDTO queryUserResource(Long id);

    /***
     * @Description  通过角色id获取关联的授权公司列表
     * @param id   角色id
     * @return com.sd365.permission.centre.pojo.vo.RoleCompanyVO
     * @Date 2022/12/29 14:57
     * @Author hantianbing
     **/
    RoleCompanyVO queryRoleCompanyById(Long id);


    /***
     * @Description 修改角色id关联的授权公司列表
     * @param roleCompanyDTO  角色公司对应信息
     * @return java.lang.Boolean
     * @Date 2022/12/29 14:57
     * @Author hantianbing
     **/
    @Transactional
    Boolean modifyRoleCompany(RoleCompanyDTO roleCompanyDTO);
}
